/**
 * @(#) MiniEditeurImpl.java
 */

package receiver;

import java.util.Observable;

public class MiniEditeurImpl extends Observable implements MiniEditeur {
	public MiniEditeurImpl(Buffer buffer, PressePapier pressePapier,
			Selection selection) {
		
		this.buffer = buffer;
		this.pressePapier = pressePapier;
		this.selection = selection;
	}

	public MiniEditeurImpl() {
		this.buffer = new Buffer("");
		this.pressePapier = new PressePapier();
		this.selection = new Selection();
		
	}

	public Buffer getBuffer() {
		return buffer;
	}

	public void setBuffer(Buffer buffer) {
		this.buffer = buffer;
	}

	public PressePapier getPressePapier() {
		return pressePapier;
	}

	public void setPressePapier(PressePapier pressePapier) {
		this.pressePapier = pressePapier;
	}

	public Selection getSelection() {
		return selection;
	}

	public void setSelection(Selection selection) {
		this.selection = selection;
	}

	private Buffer buffer;
	
	private PressePapier pressePapier;
	
	private Selection selection;
	
	/**
	 * copie la selection � partir du buffer vers  le presse-papier
	 */
	public void copier( )
	{		
		int debut = selection.getDebut();
		int fin = selection.getFin();
		
		String texte = buffer.getContenu(debut, fin);
		pressePapier.setContenu(texte);
	}
	
	/**
	 * coller la selection du presse-papier vers le buffer 
	 */
	public void coller( )
	{
		int debut = selection.getDebut();
		int fin = selection.getFin();
		
		String texte = pressePapier.getContenu();
		
		buffer.inserer(debut, fin, texte);
		this.setChanged();
		this.notifyObservers();
	}
	
	/**
	 * copie la selection � partir du buffer, l'efface et la met dans  le presse-papier
	 */
	public void couper( )
	{
		int debut = selection.getDebut();
		int fin = selection.getFin();
		
		String texte = buffer.getContenu(debut, fin);
		pressePapier.setContenu(texte);
		
		buffer.effacer(debut, fin);

		this.setChanged();
		this.notifyObservers();
	}
	
	/**
	 * selectionne un d�but et une fin dans le buffer 
	 * @param  debut de type int sp�cifie le d�but de la selection 
	 * @param fin de type int sp�cifie la fin  de la selection
	 */
	public void selectionner( int debut, int fin )
	{
		selection.setDebut(debut);
		selection.setFin(fin);
	}
	
	/**
	 * Ins�re � partir du clavier du texte dans le buffer
	 * Si début = Fin alors la chaine de caractères est vide
	 * @param texte de type String
	 * @exception StringIndexOutOfBoundsException
	 */
	public void saisirTexte( String texte ) 
	{
		 //
		int debut = selection.getDebut();
		int fin = selection.getFin();
		
		if(debut > fin) throw new StringIndexOutOfBoundsException("le début de la selection est supérieur à sa fin");		 
		
		buffer.inserer(debut, fin, texte);
		this.setChanged();
		this.notifyObservers();
	}	
}
